package com.ld.admin.util.daliySentence.impl;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.ld.admin.util.daliySentence.DaliySentence;
import com.ld.admin.util.daliySentence.DaliySentenceUtil;
import com.ld.admin.util.daliySentence.model.DaliySentenceModel;
import com.ld.shieldsb.common.core.util.JsoupUtil;
import com.ld.shieldsb.common.core.util.StringUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * 今日诗词
 * 
 * @author <a href="mailto:donggongai@126.com" target="_blank">吕凯</a>
 * @date 2020年1月8日 下午2:12:45
 *
 */
@Slf4j
public class DaliySentenceJinrishici implements DaliySentence {
    public static final String KEY = "jinrishici";
    public static final String NAME = "今日诗词";
    // 还有一个地址 https://api.gushi.ci/all.json
    public static final String URL_JINRISHICI_GETTOKEN = "https://v2.jinrishici.com/token"; // 今日诗词token
    public static final String URL_JINRISHICI = "https://v2.jinrishici.com/sentence"; // 今日诗词内容

    public static final Map<String, String> CACHE_MAP = new HashMap<>();
    public static final String CACHE_MAP_JINRISHICI_TOKEN = "JINRISHICI_TOKEN"; // 今日诗词token

    public static final String LINK_URL = "http://jinrishici.com";
    public static final String DESCRIPTION = "每次返回一句诗词。根据时间、地点、天气、事件智能推荐。支持图片和 JSON 格式调用，一分钟快速部署"; // 描述

    @Override
    public DaliySentenceModel getSentence() {
        DaliySentenceModel model = null;
        String htmlContent = null;
        String token = CACHE_MAP.get(CACHE_MAP_JINRISHICI_TOKEN);
        if (token == null) {
            JSONObject jsonObj = JsoupUtil.getRemoteURLJson(URL_JINRISHICI_GETTOKEN);
            if (jsonObj != null) {
                // {"status":"success","data":"kffyY5c/M3TOXNCJggncf2kdMsEjM+JN"}
                String status = jsonObj.getString("status");
                if ("success".equals(status)) { // 成功
                    token = (String) jsonObj.get("data");
                    CACHE_MAP.put(CACHE_MAP_JINRISHICI_TOKEN, token);
                }
            }
        }
        if (StringUtils.isNotEmpty(token)) { // 成功
            Map<String, String> headers = new HashMap<>();
            headers.put("X-User-Token", token);
            JSONObject jsonResult = JsoupUtil.getRemoteURLJson(URL_JINRISHICI, headers, null);
            /*{
                "status":"success",
                "data":{
                    "content":"百花头上开，冰雪寒中见。"},
                    "popularity":22200,
                    "origin":{
                        "dynasty":"宋代",
                        "author":"辛弃疾",
                        "title":"生查子·重叶梅",
                        "content":["百花头上开，冰雪寒中见。霜月定相知，先识春风面。","主人情意深，不管江妃怨。折我最繁枝，还许冰壶荐。"]},
                    "matchTags":["梅花","冬","寒冷"],
                    "cacheAt":"2020-01-08T10:04:50.666779",
                    "recommendedReason":"",
                    "id":"5b8b9572e116fb3714e72044",
                "ipAddress":"122.4.233.133",
                "token":"MvzcEXSM5fpzFek4wPJ767rE7gH9qIO1"
            }*/

            /*data.content 是核心，即推荐的诗句
            data.matchTags 是与你相关的标签，也是推荐给你的部分理由。
            data.recommendedReason 是推荐原因，暂未支持。
            data.cacheAt 是指我们会对每个 Token 进行预生成推荐数据并缓存。正常情况下我们会10分钟更新一次缓存数据。
            data.popularity 是我们对这句诗的流行度评价
            data.origin 源诗信息
            data.origin.translate 是整诗翻译，部分诗词有，部分没有
            token 是当前用户的 token ，原则上，同一个用户，一段时间内 Token 应该不变。
            ipAddress 是当前用户的 ip ，如果 IP 有异常，您需要查明您是否在服务端调用
            
                                        错误返回：                
            {"status": "error", "errCode": 2001, "errMessage": "No matching handler"}
            errcode 是错误码，目前只有以下几种错误码，您也简单判断 HTTP 头中的状态码，对于错误返回，我们总不会返回 200
            1001 ：内部服务器错误，HTTP状态码 500
            1002 ：API路径不对，HTTP状态码 404
            2002 ：Token不是服务器签发，HTTP状态码 400
            2003 ：IP超过每日新用户限制，HTTP状态码 400，这很有可能是您没有正确保存 Cookies 或者 Token*/
            if (jsonResult != null) {
                model = new DaliySentenceModel();
                String status = jsonResult.getString("status");
                if ("success".equals(status)) { // 成功
                    JSONObject dataResult = jsonResult.getJSONObject("data");
                    JSONObject origin = dataResult.getJSONObject("origin");

                    String originStr = "《" + origin.getString("title") + "》" + origin.getString("dynasty") + "·"
                            + origin.getString("author");
                    String content = dataResult.getString("content");

                    htmlContent = content + "<br/>——" + originStr + DaliySentenceUtil.getLinkedStr(getLinkURL(), getName());

                    model.setHtmlContent(htmlContent);
                    model.setContent(dataResult.getString("content"));
                    model.setOrigin(originStr);
                }
                model.setBaseInfo(getBaseInfo());
                log.debug(jsonResult + "");
            }
        }
        return model;
    }

    @Override
    public String getKey() {
        return KEY;
    }

    @Override
    public String getName() {
        return NAME;
    }

    @Override
    public String getURL() {
        return URL_JINRISHICI;
    }

    @Override
    public String getLinkURL() {
        return LINK_URL;
    }

    @Override
    public String getDescription() {
        return DESCRIPTION;
    }

}
